package xframe.util;

import java.io.*;
import java.text.*;
import java.util.*; 
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
public class UtilMaster {
	   static Logger log = Logger.getLogger(XMLReader.class);
	   	    /**
	   	     * @see String :  첫문자를 대문자로   변환하는 함수
	   	     * @param str  : 바꿀 대상
	   	     * @return temp : 변경된 문자
	   	     */
	   	    public static String toUpper(String str) {
	   	        String temp = str.substring(0, 1).toUpperCase()
	   	                + str.substring(1, str.length());

	   	        return temp;
	   	    }

	   	    /**
	   	     * @see String :  ArrayList에 담겨진 객체를 뽑아올때 사용되는 함수
	   	     * 특히, ArrayList에 담겨진 HashMap을 뽑아올 목적으로 만들어진 함수
	   	     * @param al  : ArrayList
	   	     * @return obj[] :  반환할 HashMap을 배열에 담아서 반환
	   	     */
	   	    public static Object[] getDataOnArrayList(ArrayList al){
	   	        HashMap hm = (HashMap)al.get(0);
	   	        Set set =hm.keySet();
	   	        return set.toArray();
	   	    }

	   	    /**
	   	     * @see String :  Map에 담긴 키를 배열로 뽑아내는 함수
	   	     * @param mp  : 뽑아낼 Map
	   	     * @return values :  키를 배열로 반환
	   	     */
	   	    public static String[] getHashKeys(Map mp){
	   	        String[] values =new String[mp.size()];
	   	        Set set = mp.keySet();
	   	        Object[] obj = set.toArray();
	   	        for(int i = 0 ; i <mp.size(); i++){
	   	            values[i] = (String)obj[i];
	   	            //System.out.println("values["+i+"]"+null2Empty(values[i]));
	   	        }
	   	        return values;
	   	    }

	   	    /**
	   	     * @see String :  Map에 담긴 키를 배열로 뽑아내는 함수
	   	     * @param mp  : 뽑아낼 Map
	   	     * @return values :  키를 배열로 반환
	   	     */
	   	      public static String[] getHashValues(Map mp){
	   	        String[] values =new String[mp.size()];
	   	        Set set = mp.keySet();
	   	        Object[] obj = set.toArray();
	   	        for(int i = 0 ; i <mp.size(); i++){
	   	            values[i] = (String)mp.get(obj[i]);
	   	        }
	   	        return values;
	   	    }

	   	    /**
	   	     * @see String :  String의 타입으로 현재 시간을 가져오는 함수
	   	     * @param yyyyMMdd  : 날짜타입을 입력한다.
	   	     * @return timestring.format(currentdate) :  반환할 Date의 String  타입
	   	     * 사용예 : getToday("yyyy-MM-dd");  ==>  2004-11-15
	   	     */
	   	    /*
	   	    캐릭터  일자 또는 시각의 컴퍼넌트  표시  례
	   	    G  기원  텍스트  AD
	   	    y  년  년  1996; 96
	   	    M  월  월  July; Jul; 07
	   	    w  해에 있어서의 주  수치  27
	   	    W  달에 있어서의 주  수치  2
	   	    D  해에 있어서의 날  수치  189
	   	    d  달에 있어서의 날  수치  10
	   	    F  달에 있어서의 요일  수치  2
	   	    E  요일  텍스트  Tuesday; Tue
	   	    a  오전/오후  텍스트  PM
	   	    H  하루에 있어서의 때 (0 ~ 23)  수치  0
	   	    k  하루에 있어서의 때 (1 ~ 24)  수치  24
	   	    K  오전/오후때 (0 ~ 11)  수치  0
	   	    h  오전/오후때 (1 ~ 12)  수치  12
	   	    m  분  수치  30
	   	    s  초  수치  55
	   	    S  밀리 세컨드  수치  978
	   	    z  타임 존  일반적인 타임 존  Pacific Standard Time; PST; GMT-08:00
	   	    Z  타임 존  RFC 822 타임 존  -0800  */



	   	    public static String getToday(String yyyyMMdd) {
	   	        java.util.Date currentdate = new java.util.Date();
	   	        java.text.SimpleDateFormat timestring = new java.text.SimpleDateFormat(yyyyMMdd);
	   	        return timestring.format(currentdate);
	   	    }

	   	    /**
	   	     * @see String :  String의 타입으로 일정시간 후의 날짜를 가져오는 함수
	   	     * @param yyyyMMdd  : 날짜타입을 입력한다.
	   	     * @param type  : 월인지, 일인지, 구분자
	   	     * @param num  : 추가될 날짜의 일 수(음의 값도 입력이 가능하다.)
	   	     * @return timestring.format(currentDate)
	   	     * 사용예 : getSomeday("yyyy-MM-dd", Calendar.MONTH, 1);  ==>  오늘부터 한달 후의 날짜를 리턴한다.
	   	     */
	   	    public static String getSomeday(String yyyyMMdd, int type, int num){
	   	        Calendar currentCal = Calendar.getInstance();
	   	        currentCal.add(type, num);
	   	        java.util.Date currentDate =   currentCal.getTime();
	   	        java.text.SimpleDateFormat timestring = new java.text.SimpleDateFormat(yyyyMMdd);

	   	        return timestring.format(currentDate);

	   	    }
	   	    
	   	    /**
	   	     * @see String :  특정일에서 다시 특정일을 계산하는 함수
	   	     * @param today_yyyyMMdd  : 기준이되는 날짜를 yyyyMMdd 타입으로 입력
	   	     * @param yyyyMMdd  : 반환할 날짜의 타입을 설정한다.
	   	     * @param type  : 월인지, 일인지, 구분자
	   	     * @param num  : 추가될 날짜의 일 수(음의 값도 입력이 가능하다.)
	   	     * @return simpleDate.format(sDate)
	   	     * 사용예 : getSomeday("20091001", "yyyy-MM-dd", Calendar.MONTH, 1);  ==>  20091001 부터 한달 후의 날짜를 리턴한다.
	   	     */
	   	    public static String getSomeday(String today_yyyyMMdd, String yyyyMMdd, int type, int num){

	   	        if(today_yyyyMMdd.trim().length() == 8){
	   	            today_yyyyMMdd = today_yyyyMMdd.trim();

	   	            Calendar currentCal = Calendar.getInstance();
	   	            currentCal.set(Calendar.YEAR,Integer.parseInt(today_yyyyMMdd.substring(0,4)));
	   	            currentCal.set(Calendar.MONTH,Integer.parseInt(today_yyyyMMdd.substring(4,6))-1);
	   	            currentCal.set(Calendar.DATE,Integer.parseInt(today_yyyyMMdd.substring(6,8)));

	   	            Date sDate = currentCal.getTime();
	   	            currentCal.add(type, num);
	   	            SimpleDateFormat simpleDate = new SimpleDateFormat(yyyyMMdd);

	   	            return simpleDate.format(sDate);
	   	        }else{
	   	            System.out.println("[error] Only 'yyyyMMdd' format supported. ");
	   	            return null;
	   	        }
	   	    }

	   	    /**
	   	     * @see String :  특정월에서 마지막날 구하기
	   	     * @param today_yyyyMMdd  : 기준이되는 날짜를 yyyyMMdd 타입으로 입력
	   	     * @param format  : 반환할 날짜의 타입을 설정한다.
	   	     * @return timestring.format(currentDate)
	   	     * 사용예 : getSomeday("20091001", "yyyy-MM-dd", Calendar.MONTH, 1);  ==>  20091001 부터 한달 후의 날짜를 리턴한다.
	   	     */
	   	    //
	   	    public static String getLastDay(String today_yyyyMMdd, String format){
	   	        if(today_yyyyMMdd.trim().length() == 8){
	   	             today_yyyyMMdd = today_yyyyMMdd.trim();

	   	            Calendar cal = Calendar.getInstance();
	   	            cal.set(Calendar.YEAR,Integer.parseInt(today_yyyyMMdd.substring(0,4)));
	   	            cal.set(Calendar.MONTH,Integer.parseInt(today_yyyyMMdd.substring(4,6))-1);
	   	            cal.set(Calendar.DATE,cal.getActualMaximum(Calendar.DATE));

	   	            Date sDate = cal.getTime();
	   	            SimpleDateFormat simpleDate = new SimpleDateFormat(format);

	   	            return simpleDate.format(sDate);
	   	        }else{
	   	            System.out.println("[error] Only 'yyyyMMdd' format supported. ");
	   	            return null;
	   	        }

	   	    }


	   	    /**
	   	     * @see String :  null 값을 boolean 타입으로 변경하는 함수
	   	     * @param str  : 변경할 문자열
	   	     * @return  : 변경된 값
	   	     * 특히, request.getParameter("data"); 를 위해 만들어진 함수
	   	     * 사용예 :    boolean flag = null2Boolean(request.getParameter("data"));
	   	     */
	   	    public static boolean null2Boolean(String str) {
	   	        return ((str == null) || str.trim().toLowerCase().equals("true"))? true : false;
	   	    }

	   	    /**
	   	     * @see String :  null 값을 boolean 타입으로 변경하는 함수로 defaultValue 값을 지정할 수 있는 함수이다.
	   	     * @param inputString  : 변경할 문자열
	   	     * @param defaultValue  : 변결할 문자열이 null 이거나 true 이면 지정할 수 잇는 함수
	   	     * @return b_returnVal : 변경된 값
	   	     * 특히, request.getParameter("data"); 를 위해 만들어진 함수
	   	     * 사용예 :    boolean flag = null2Boolean(request.getParameter("data"), false);
	   	     */
	   	    public static boolean null2Boolean(String inputString, boolean defaultValue) {
	   	        boolean b_returnVal = false;

	   	        if ((inputString == null) || inputString.trim().equals("")) {
	   	            b_returnVal = defaultValue;
	   	        } else if (inputString.trim().toLowerCase().equals("true")) {
	   	            b_returnVal = true;
	   	        } else {
	   	            b_returnVal = false;
	   	        }

	   	        return b_returnVal;
	   	    }

	   	    /**
	   	     * @see String :  제거할 문자열이 포함된 문자열
	   	     * @param str  : 변경할 문자열
	   	     * @return changedStr : 제거된 문자열
	   	     * 사용예 :    String flag = removeText('"I love Java" "Java");
	   	     */
	   	    public static String removeText(String str, String delimiter) {
	   	        String changedStr = "";
	   	        StringTokenizer strToken = new StringTokenizer(str, delimiter);

	   	        while (strToken.hasMoreTokens()) {
	   	            changedStr += strToken.nextToken();
	   	        }
	   	        return changedStr;
	   	    }

	   	    /**
	   	     * @see String :  null 값을 boolean 타입으로 변경하는 함수
	   	     * @param str  : 변경할 문자열
	   	     * @return  : 변경된 값
	   	     * 특히, request.getParameter("data"); 를 위해 만들어진 함수
	   	     * 사용예 :    boolean flag = null2Boolean(request.getParameter("data"));
	   	     */
	   	    public static String null2Zero(String str) {
	   	        return ((str == null) || str.trim().equals("")) ? "0" : str;
	   	    }

	   	    /**
	   	     * @see String :  null 값을 String 타입으로 default 값으로 변경하는 함수
	   	     * @param str  : 변경할 문자열
	   	     * @param Default  : default 문자열
	   	     * @return  : 변경된 값
	   	     * 특히, request.getParameter("data"); 를 위해 만들어진 함수
	   	     * 사용예 :    String flag = null2Default(request.getParameter("data"), '"NOT");
	   	     */
	   	    public static String null2Default(String str, String Default) {
	   	        return ((str == null) || str.trim().equals("")) ? Default : str.trim();
	   	    }

	   	    /**
	   	     * @see String :  null 값의 String을 빈 문자열로 반환하는 함수
	   	     * @param str  : 변경할 문자열
	   	     * @return  : 변경된 값
	   	     * 특히, request.getParameter("data"); 를 위해 만들어진 함수
	   	     * 사용예 :    String flag = null2Empty(request.getParameter("data"))
	   	     */
	   	    public static String null2Empty(String str) {
	   	       // if(str == null){
	   	           // System.out.println(" 널이다.   ");}
	   	        return ((str == null) || str.trim().equals("")) ? "" : str.trim();
	   	    }

	   	    public static String null2Empty(Object obj) {
	   	        String str = (String)obj;
	   	        return ((str == null) || str.trim().equals("")) ? "" : str.trim();
	   	    }

	   	    /**
	   	     * @see String :  null 값의 String을 빈 문자열로 반환하는 함수 null2Empty 와 같으나 이 함수는 trim을 하지 않는다.
	   	     * @param str  : 변경할 문자열
	   	     * @return  : 변경된 값
	   	     * 특히, request.getParameter("data"); 를 위해 만들어진 함수
	   	     * 사용예 :    String flag = null2Empty(request.getParameter("data"))
	   	     */
	   	    public static String null2EmptyNoTrim(String str) {
	   	        return ((str == null) || str.equals("")) ? "" : str;
	   	    }


	   	    /**
	   	     * @see String :  숫자를 일정한 타입으로 변환하여 보여줄때 사용되는 함수
	   	     * @param str  : 변경할 문자열
	   	     * @param formatType  : 변경할 포멧타입
	   	     * @return  : str
	   	     * 특히, 쿼리에서 테이터를 변경하지 않은 컬럼을 화면에서 util을 통해서 변경할때 사용되는 함수이다.
	   	     *  세자리마다 콤마와 소수점3자리에서 반올림하는 경우..###,###,##0.00
	   	     * 사용예 :    <%=formatChange("356785", "###,###,##0.00")%>
	   	     */
	   	    public static String formatChange(String str, String formatType) {

	   	        return formatChange(Long.parseLong(str), formatType);
	   	    }

	   	    /**
	   	     * @see String :  숫자를 일정한 타입으로 변환하여 보여줄때 사용되는 함수
	   	     * @param input  : 변경할 문자열
	   	     * @param formatType  : 변경할 포멧타입
	   	     * @return  : str
	   	     * 특히, 쿼리에서 테이터를 변경하지 않은 컬럼을 화면에서 util을 통해서 변경할때 사용되는 함수이다.
	   	     *  세자리마다 콤마와 소수점3자리에서 반올림하는 경우..###,###,##0.00
	   	     * 사용예 :    <%=formatChange("356785", "###,###,##0.00")%>
	   	     */
	   	    public static String formatChange(int input, String formatType) {
	   	         return formatChange(Long.parseLong(input+""), formatType);
	   	    }

	   	    /**
	   	     * @see String :  숫자를 일정한 타입으로 변환하여 보여줄때 사용되는 함수
	   	     * @param input  : 변경할 문자열
	   	     * @param formatType  : 변경할 포멧타입
	   	     * @return  : str
	   	     * 특히, 쿼리에서 테이터를 변경하지 않은 컬럼을 화면에서 util을 통해서 변경할때 사용되는 함수이다.
	   	     *  세자리마다 콤마와 소수점3자리에서 반올림하는 경우..###,###,##0.00
	   	     * 사용예 :    <%=formatChange("356785", "###,###,##0.00")%>
	   	     */
	   	    public static String formatChange(float input, String formatType) {
	   	         return formatChange(Long.parseLong(input+""), formatType);
	   	    }

	   	    /**
	   	     * @see String :  숫자를 일정한 타입으로 변환하여 보여줄때 사용되는 함수
	   	     * @param input  : 변경할 문자열
	   	     * @param formatType  : 변경할 포멧타입
	   	     * @return  : str
	   	     * 특히, 쿼리에서 테이터를 변경하지 않은 컬럼을 화면에서 util을 통해서 변경할때 사용되는 함수이다.
	   	     *  세자리마다 콤마와 소수점3자리에서 반올림하는 경우..###,###,##0.00
	   	     * 사용예 :    <%=formatChange("356785", "###,###,##0.00")%>
	   	     */
	   	    public static String formatChange(double input, String formatType) {
	   	        DecimalFormat df = new DecimalFormat(formatType);

	   	        return df.format(input);
	   	    }

	   	    /**
	   	     * @see String :  숫자를 일정한 타입으로 변환하여 보여줄때 사용되는 함수
	   	     * @param input  : 변경할 문자열
	   	     * @param formatType  : 변경할 포멧타입
	   	     * @return  : str
	   	     * 특히, 쿼리에서 테이터를 변경하지 않은 컬럼을 화면에서 util을 통해서 변경할때 사용되는 함수이다.
	   	     *  세자리마다 콤마와 소수점3자리에서 반올림하는 경우..###,###,##0.00
	   	     * 사용예 :    <%=formatChange("356785", "###,###,##0.00")%>
	   	     */
	   	    public static String formatChange(long input, String formatType) {
	   	        DecimalFormat df = new DecimalFormat(formatType);
	   	       // NumberFormat nf = java.text.NumberFormat.getInstance();
	   	        return df.format(input);
	   	    }



	   	    /**
	   	     * @see String :  특정 문자열의 8859_1 인코딩을 변경하고자 할때
	   	     * @param str  : 변경할 대상 문자열
	   	     * @return  : 변경된 문자
	   	     * 사용예 :
	   	     * Strig test = toEng("강백석 입니다.");
	   	     */
	   	    public static String toEng(String str) throws Exception {
	   	        if (str == null) {
	   	            return "";
	   	        }

	   	        return new String(str.trim().getBytes("KSC5601"), "8859_1");
	   	    }

	   	    /**
	   	     * @see String :  특정 문자열의 KSC5601 인코딩을 변경하고자 할때
	   	     * @param str  : 변경할 대상 문자열
	   	     * @return  : 변경된 문자
	   	     * 사용예 :
	   	     * Strig test = toKor("강백석 입니다.");
	   	     */
	   	    public static String toKor(String str) throws Exception {
	   	        if (str == null) {
	   	            return "";
	   	        } else {
	   	            return new String(str.trim().getBytes("8859_1"), "KSC5601");
	   	        }
	   	    }

	   	    /**
	   	     * @see String :  문자열을 HTML로 변경하고자 할때 사용되는 함수
	   	     * @param value  : 변경할 대상 문자열
	   	     * @return  : 변경된 html 코드
	   	     * 사용예 :
	   	     * Strig test = convertHtml("\n\n안녕");
	   	     */
	   	    public static String convertHtml(String value) {
	   	        if (value == null) {
	   	            return "";
	   	        }

	   	        char[] arr = value.toCharArray();
	   	        StringBuffer sb = new StringBuffer();
	   	        boolean blank = true;

	   	        for (int i = 0; i < arr.length; i++) {
	   	            switch (arr[i]) {
	   	                case '\n':
	   	                    sb.append("<br>\n");

	   	                    break;

	   	                case '\r':
	   	                    break;

	   	                case '\t':
	   	                    sb.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ");

	   	                    break;

	   	                case '\"':
	   	                    sb.append("&quot;");

	   	                    break;

	   	                case '<':
	   	                    sb.append("&lt;");

	   	                    break;

	   	                case '>':
	   	                    sb.append("&gt;");

	   	                    break;

	   	                case ' ':

	   	                    if (blank) {
	   	                        sb.append(" ");
	   	                        blank = false;
	   	                    } else {
	   	                        sb.append("&nbsp;");
	   	                        blank = true;
	   	                    }

	   	                    break;

	   	                case '&':
	   	                    sb.append("&amp;");

	   	                    break;

	   	                default:
	   	                    sb.append(arr[i]);
	   	            }
	   	        }

	   	        return sb.toString();
	   	    }


	   	    /**
	   	     * @see String :   HTML에서 태그를 제거하고 할때 사용되는 함수
	   	     * @param s  : 변경할 대상 문자열
	   	     * @return  : html 코드가 제거된 문자열
	   	     * 사용예 :
	   	     * Strig test = removeTag("<body>안녕</body>");
	   	     */
	   	    public static String removeTag(String s) {
	   	        final int NORMAL_STATE = 0;
	   	        final int TAG_STATE = 1;
	   	        final int START_TAG_STATE = 2;
	   	        final int END_TAG_STATE = 3;
	   	        final int SINGLE_QUOT_STATE = 4;
	   	        final int DOUBLE_QUOT_STATE = 5;
	   	        int state = NORMAL_STATE;
	   	        int oldState = NORMAL_STATE;
	   	        char[] chars = s.toCharArray();
	   	        StringBuffer sb = new StringBuffer();
	   	        char a;

	   	        for (int i = 0; i < chars.length; i++) {
	   	            a = chars[i];

	   	            switch (state) {
	   	                case NORMAL_STATE:

	   	                    if (a == '<') {
	   	                        state = TAG_STATE;
	   	                    } else {
	   	                        sb.append(a);
	   	                    }

	   	                    break;

	   	                case TAG_STATE:

	   	                    if (a == '>') {
	   	                        state = NORMAL_STATE;
	   	                    } else if (a == '\"') {
	   	                        oldState = state;
	   	                        state = DOUBLE_QUOT_STATE;
	   	                    } else if (a == '\'') {
	   	                        oldState = state;
	   	                        state = SINGLE_QUOT_STATE;
	   	                    } else if (a == '/') {
	   	                        state = END_TAG_STATE;
	   	                    } else if ((a != ' ') && (a != '\t') && (a != '\n')
	   	                            && (a != '\r') && (a != '\f')) {
	   	                        state = START_TAG_STATE;
	   	                    }

	   	                    break;

	   	                case START_TAG_STATE:
	   	                case END_TAG_STATE:

	   	                    if (a == '>') {
	   	                        state = NORMAL_STATE;
	   	                    } else if (a == '\"') {
	   	                        oldState = state;
	   	                        state = DOUBLE_QUOT_STATE;
	   	                    } else if (a == '\'') {
	   	                        oldState = state;
	   	                        state = SINGLE_QUOT_STATE;
	   	                    } else if (a == '\"') {
	   	                        state = DOUBLE_QUOT_STATE;
	   	                    } else if (a == '\'') {
	   	                        state = SINGLE_QUOT_STATE;
	   	                    }

	   	                    break;

	   	                case DOUBLE_QUOT_STATE:

	   	                    if (a == '\"') {
	   	                        state = oldState;
	   	                    }

	   	                    break;

	   	                case SINGLE_QUOT_STATE:

	   	                    if (a == '\'') {
	   	                        state = oldState;
	   	                    }

	   	                    break;
	   	            }
	   	        }

	   	        return sb.toString();
	   	    }

	   	    /**
	   	     * @see String :   문자열을 long 타입으로 변경할때
	   	     * @param str  : 변경할 대상 문자열
	   	     * @return  longStr : long 타입으로 변경된 값
	   	     * 사용예 :
	   	     * Strig test = toLong("9999");
	   	     */
	   	    public static long toLong(String str) throws Exception {
	   	        long longStr = 0;

	   	        if ((str == null) && (str.length() < 1)) {
	   	            longStr = 0;
	   	        } else {
	   	            longStr = Long.parseLong(str);
	   	        }

	   	        return longStr;
	   	    }

	   	    /**
	   	     * @see String :   문자열을 int 타입으로 변경할때
	   	     * @param str  : 변경할 대상 문자열
	   	     * @return  longStr : long 타입으로 변경된 값
	   	     * 사용예 :
	   	     * Strig test = toLong("9999");
	   	     */
	   	    public static int toInt(String str) throws Exception {
	   	        int intstr = 0;

	   	        if ((str == null) && (str.length() < 1)) {
	   	            intstr = 0;
	   	        } else {
	   	            intstr = Integer.parseInt(str);
	   	        }

	   	        return intstr;
	   	    }


	   	    /**
	   	     * 문장내의 문자열을 변환하는 함수
	   	     *
	   	     * @param   src  : 원래 문자열
	   	     * @param   oldstr  : 바꿀 문자열
	   	     * @param   newstr  : 새로운 문자열
	   	     * @return   string   : 바뀐 문자열로 리턴
	   	     */
	   	    public static String replace(String src, String oldstr, String newstr) {
	   	        if (src == null)
	   	            return null;

	   	        StringBuffer dest = new StringBuffer("");
	   	        int  len = oldstr.length();
	   	        int  srclen = src.length();
	   	        int  pos = 0;
	   	        int  oldpos = 0;

	   	        while ((pos = src.indexOf(oldstr, oldpos)) >= 0) {
	   	            dest.append(src.substring(oldpos, pos));
	   	            dest.append(newstr);
	   	            oldpos = pos + len;
	   	        }

	   	        if (oldpos < srclen)
	   	            dest.append(src.substring(oldpos, srclen));

	   	        return dest.toString();
	   	    }



	   	    /**
	   	     * JSP 코딩시 html 객체의 값을 alert 로 확인가능하다.
	   	     *
	   	     * @param   is  : 사용여부
	   	     * @return   string   : 바뀐 문자열로 리턴
	   	     * 사용예 )
	   	     * <script>UtilMaster.htmlDebug(true);</script>
	   	     */
	   	    public static String htmlDebug(boolean is){
	   	        String  returnStr="";
	   	        if(is){
	   	            returnStr ="document.ondblclick =new Function('debug()');\n" +
	   	                    "function debug(){\n" +
	   	                    "             if(  event.srcElement.name != null){\n" +
	   	                    "            var this_name = event.srcElement.name;\n" +
	   	                    "            var this_value =   event.srcElement.value;\n" +
	   	                    "            var this_form_name = event.srcElement.form.name;\n" +
	   	                    "            var this_id = event.srcElement.id;\n" +
	   	                    "            var this_class_name = event.srcElement.className;\n" +
	   	                    "            var max_len = event.srcElement.maxLength;\n" +
	   	                    "            var this_innerHTML =  event.srcElement.parentElement.innerHTML;\n" +
	   	                    "             window.clipboardData.setData('Text',  this_name);\n" +
	   	                    "        alert(\"◎ form name : \"+this_form_name+\"\\n\\n★ name : \"+this_name+\"\\n\\n◎ value : \"+ this_value+\"\\n\\n◎ id : \"+ this_id+\"\\n\\n◎ class name : \"+this_class_name+\"\\n\\n◎ max_len : \"+max_len+\"\\n\\n==============================================================================\\n\"+this_innerHTML+\"\\n\\n\\nBy akami..\");\n" +
	   	                    "    }\n" +
	   	                    "}";
	   	        }
	   	        return returnStr;
	   	    }

	   	    /**
	   	     * @param   array  : 문자가 담긴 배열
	   	     * @return   check_data   : 찾을 문자열
	   	     * 사용예 )   생략
	   	     */
	   	    public static boolean isThere(String[] array, String check_data){
	   	        for(int i = 0 ; i < array.length ; i++ ){
	   	            if(array[i].equals(check_data)){
	   	                return  true;
	   	            }
	   	        }
	   	        return   false;
	   	    }

	   	    /**
	   	     * 로그를 찍기 위한 함수
	   	     *
	   	     * @param   LOG_FILE_PATH      :  log를 남길 파일 경로
	   	     * @param   writeTime  : 로그에 시간을 찍을지 여부
	   	     * @param   err_msg  : 로그를 남길 메세지
	   	     * @param   writeConsole  : System.out.println 으로 찍을 것인지 여부
	   	     *사용예 )
	   	     *  log("/encar/clog/2510_refrence0.txt", true, request.getHeader( "REFERER"), true);
	   	     *  log("/encar/clog/2510_refrence0.txt", true, "로그메세지....", true);
	   	     */
	   	    public static void log(String LOG_FILE_PATH, boolean writeTime, String err_msg, boolean writeConsole){

	   	        java.io.FileOutputStream LOG_FILE =null;

	   	        String msg = err_msg;
	   	        if(writeConsole){
	   	            System.out.println(err_msg);
	   	        }

	   	        if(writeTime){
	   	            msg = UtilMaster.getToday("[MM/dd HH:m:s]")+" :"+err_msg;
	   	        }

	   	        byte[] message = msg.getBytes();

	   	        try {
	   	            LOG_FILE = new java.io.FileOutputStream(LOG_FILE_PATH , true);
	   	            LOG_FILE.write(message);
	   	            LOG_FILE.write('\n');
	   	            LOG_FILE.close();
	   	        } catch (java.io.IOException ex) {
	   	            System.err.println(ex);
	   	        }
	   	    }

	   	    /**
	   	     * 로그를 찍기 위한 함수
	   	     *
	   	     * @param   LOG_FILE_PATH      :  log를 남길 파일 경로
	   	     * @param   err_msg  : 로그를 남길 메세지
	   	     * *사용예 )
	   	     *  log("/encar/clog/2510_refrence0.txt",  "Reffer "+request.getHeader( "REFERER"));
	   	     */
	   	    public static void log(String LOG_FILE_PATH, String err_msg){

	   	        java.io.FileOutputStream LOG_FILE =null;

	   	        String msg = err_msg;

	   	        byte[] message = msg.getBytes();

	   	        try {
	   	            LOG_FILE = new java.io.FileOutputStream(LOG_FILE_PATH , true);
	   	            LOG_FILE.write(message);
	   	            LOG_FILE.write('\n');
	   	            LOG_FILE.close();
	   	        } catch (java.io.IOException ex) {
	   	            System.err.println(ex);
	   	        }
	   	    }

	   	    /**
	   	     * 이전 url을 찍기위한 함수 로그를 찍기 위한 함수
	   	     *
	   	     * @param   LOG_FILE_PATH      :  log를 남길 파일 경로
	   	     * @param   request  : HttpServletRequest 객체
	   	     * *사용예 )
	   	     *  writeRefferURL("/encar/clog/2510_refrence0.txt",  request);
	   	     */
	   	    public static void writeRefferURL(String LOG_FILE_PATH, HttpServletRequest request){
	   	        log(LOG_FILE_PATH, true, request.getHeader( "REFERER"), false);
	   	    }


	   	     //콘솔에 뿌릴지를 결정하는 함수
	   	    public static void consoleOut(String key, String msg) throws XMLQueryException {
	   	        if(("true").equalsIgnoreCase(DynamicVar.get(key,"false"))){
	   	          // log.info(msg);
	   	            System.out.println(msg);
	   	         }
	   	    }

	   	     public static String runShell(String shellName){
	   	        String getMsg="";
	   	        try {
	   	            Runtime rt = Runtime.getRuntime();
	   	            Process proc = rt.exec(shellName);

	   	            BufferedReader procStdOut =	new BufferedReader(new InputStreamReader(proc.getInputStream()));

	   	            String line;
	   	                while( true ) {
	   	                line=procStdOut.readLine();
	   	                if( line==null ) break;
	   	                    getMsg+=line;
	   	                }

	   	            }catch(Exception e){
	   	               e.printStackTrace();
	   	           }
	   	         return getMsg;
	   	    }

	   	    public static String replaceStr(String str, int len) {
	   	      if (str == null || len <= 0) {
	   	       return null;
	   	      }

	   	      StringBuffer result = new StringBuffer();
	   	      result.append(str.substring(0, len));

	   	      int strLen = str.length();
	   	      for(int i = len; i < strLen; i++) {
	   	       result.append("*");
	   	      }

	   	      return result.toString();
	   	     }

	   	     public static String replaceStr(String str, String delimeter) {
	   	      if (str == null ) {
	   	       return null;
	   	      }

	   	      int len = 0;
	   	      StringBuffer result = new StringBuffer();
	   	      result.append(str.substring(0, len));

	   	      int strLen = str.length();
	   	      for(int i = len; i < strLen; i++) {
	   	       result.append(delimeter);
	   	      }

	   	      return result.toString();
	   	     }

	   	    /**
	   	    * 주어진 length를 유지하기 위해 String s에 character c를 오른쪽으로 덧댄다.
	   		* <p>
	   		* <pre>
	   		* StringUtil.padRight("hahahaha", '.', 14);
	   		* StringUtil.padRight("hihihi", '.', 14);
	   		* StringUtil.padRight("hohohohoho", '.', 14);

	   		* 은 다음과 같은 결과를 보여줄 것이다.

	   		* hahahaha.....
	   		* hihihi.......
	   		* hohohohoho...
	   		* </pre>
	   		* 위와 같이 일정한 사이즈로 문단을 구성하고자 할 때 유용할 것 임
	   	    * @param s source String
	   	    * @param c String s에 덧대질 character
	   	    * @param length return될 String의 length
	   	    */
	   	    public static String padRight( String s, char c, int length )
	   	    {
	   	        return s + fill( c, length - s.length() );
	   	    }

	   	   /**
	   	    * 주어진 length를 유지하기 위해 String s에 character c를 왼쪽으로 덧댄다.
	   		* <p>
	   		* <pre>
	   		* StringUtil.padRight("hahahaha", '.', 14);
	   		* StringUtil.padRight("hihihi", '.', 14);
	   		* StringUtil.padRight("hohohohoho", '.', 14);

	   		* 은 다음과 같은 결과를 보여줄 것이다.

	   		* .....hahahaha
	   		* .......hihihi
	   		* ...hohohohoho
	   		* </pre>
	   		* 위와 같이 일정한 사이즈로 문단을 구성하고자 할 때 유용할 것 임
	   	    * @param s source String
	   	    * @param c String s에 덧대질 character
	   	    * @param length return될 String의 length
	   	    */
	   	    public static String padLeft( String s, char c, int length )
	   	    {
	   	        return fill( c, length - s.length() ) + s;
	   	    }

	   	    /**
	   	        * character c로 length만큼 채워진 String을 return
	   	        * @param c string으로 채워질 character
	   	        * @param length 원하는 character 갯수
	   	        * @return charracter c로 length 갯수 만큼 채워진 string
	   	        */
	   	       public static String fill( char c, int length )
	   	       {
	   	           if( length <= 0 ) return "";

	   	           char[] ca = new char[length];
	   	           for( int index = 0; index < length; index++ )
	   	           {
	   	               ca[index] = c;
	   	           }

	   	           return new String( ca );
	   	       }


	   	      /**
	   	    * 전달된 문자열의 길이를 넘겨온 길이에 맞게 잘라서 넘겨준다.
	   	    * 잘린 String에 Attach String을 덧붙여서 리턴한다.
	   	    * @param src 변환할 문자열
	   	    * @param str_length 자를 문자 길이
	   	    * @param att_str 잘린 문자를 대체할 문자
	   	    * @return String 잘린 문자열
	   	    */
	   	    public static String cutString(String src, int str_length, String att_str)
	   		{
	   			int ret_str_length = 0;

	   			String ret_str = new String("");

	   			if (src == null)
	   			{
	   				return ret_str;
	   			}

	   			// 현재 환경의 Character length를 구한다.
	   			String tempMulLanChar = new String("가");
	   			int lanCharLength = tempMulLanChar.length();

	   			// Character가 중간에 잘리지 않게 하기위해 넣은 변수
	   			int multiLanCharIndex = 0;
	   			int nonMultiLanCharIndex = 0;

	   			for (int i=0; i<src.length(); i++)
	   			{
	   				ret_str += src.charAt(i);

	   				if (src.charAt(i)>'~')
	   				{
	   					ret_str_length = ret_str_length + 2/lanCharLength;
	   					multiLanCharIndex++;
	   				}
	   				else
	   				{
	   					ret_str_length = ret_str_length + 1;
	   					nonMultiLanCharIndex++;
	   				}
	   				if(ret_str_length >= str_length && (multiLanCharIndex%lanCharLength) == 0  )
	   				{
	   					if (src.length() != multiLanCharIndex + nonMultiLanCharIndex)
	   						ret_str += null2Empty((att_str));
	   					break;
	   				}
	   			}

	   			return ret_str;
	   		}

	   	 /**
	   	     * 대소문자를 상관하지 않고 str 문자열에 포함된 keyword 를 찾아서 
	   	     * 원래의 문자에 붉은색 폰트태그를 삽입한 문자열 반환 Method markKeyword.
	   	     * <p>by kenu at http://okjsp.pe.kr </p>
	   	     * @param str
	   	     * @param keyword
	   	     * @return String
	   	     */
	   	    public static String markKeyword(String str, String keyword) {
	   	    	if(keyword !=null && keyword.trim().length()>0){
	   	        keyword =
	   	            replace(
	   	                replace(replace(keyword, "[", "\\["), ")", "\\)"),
	   	                "(", "\\(");

	   	        Pattern p = Pattern.compile( keyword , Pattern.CASE_INSENSITIVE );
	   	        Matcher m = p.matcher( str );
	   	        int start = 0;
	   	        int lastEnd = 0;
	   	        StringBuffer sbuf = new StringBuffer();
	   	        while( m.find() ) {
	   	            start = m.start();
	   	            sbuf.append( str.substring(lastEnd, start) )
	   	                .append("<font color='red' size='4' style=\"BACKGROUND-COLOR: #FFFF00\"><strong>"+m.group()+"</strong></font>" );
	   	            lastEnd = m.end();
	   	        } 
	   	        return sbuf.append(str.substring(lastEnd)).toString() ;
	   	    	}else{
	   	    		return str;
	   	    	}
	   	    }

	   	}




